Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: guozf   发起时间: 2009-06-26 10:06 上午   回复: 2

Print Search
帖子排序:    
   2009-06-26, 10:06 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
设置WinDbg为PostMortem的一些问题
Reply Quote

对注册表作如下设置:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Auto"="1"
"Debugger"="\"C:\\WinDbg\\windbg.exe\" -p %ld -e %ld
"UserDebuggerHotKey"=dword:00000000

之后有程序的Crash都可以Invoke Windbg来attach到这个程序,但是下面的这段程序的Crash(在程序中主动调用AfxThrowMemoryException或者throw std::exception("hello world"))没有导致WinDbg被调用且被附加:
int foo(int x,inty)
{
       AfxThrowMemoryException();
       //throw std::exception("hello world");
      return 1;
}

程序中调用这个函数之后

WinDbg并没有被调用?请各位高手给个解释?Thanks in advance!


IP 地址: 已记录   报告
   2009-06-26, 14:56 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 设置WinDbg为PostMortem的一些问题
Reply Quote

这是因为应用程序内部的运行库代码捕捉并处理了这个异常,没有执行到崩溃和JIT调试那一阶段。

如果是带有窗口的MFC程序,那么MFC库的默认窗口函数中有一个TRY{}CATCH(),用户代码没有处理的异常会被这个CATCH捕捉到,参考MFC源代码的WINCORE.CPP中的AfxCallWndProc函数:

LRESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg,
 WPARAM wParam = 0, LPARAM lParam = 0)
{

...

 TRY
 {
#ifndef _AFX_NO_OCC_SUPPORT
  // special case for WM_DESTROY
  if ((nMsg == WM_DESTROY) && (pWnd->m_pCtrlCont != NULL))
   pWnd->m_pCtrlCont->OnUIActivate(NULL);
#endif

  // special case for WM_INITDIALOG
  CRect rectOld;
  DWORD dwStyle = 0;
  if (nMsg == WM_INITDIALOG)
   _AfxPreInitDialog(pWnd, &rectOld, &dwStyle);

  // delegate to object's WindowProc
  lResult = pWnd->WindowProc(nMsg, wParam, lParam);

  // more special case for WM_INITDIALOG
  if (nMsg == WM_INITDIALOG)
   _AfxPostInitDialog(pWnd, rectOld, dwStyle);
 }
 CATCH_ALL(e)
 {
  lResult = AfxGetThread()->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
  TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
   lResult);
  DELETE_EXCEPTION(e);
 }
 END_CATCH_ALL

 


IP 地址: 已记录   报告
   2009-06-27, 15:49 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: 设置WinDbg为PostMortem的一些问题
Reply Quote
谢谢.
IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » 设置WinDbg为PostMortem的一些问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.